# 继承是在不改变原有类的基础上扩展原有类的功能
# 子类会自动拥有父类的公共成员(不会继承父类的私有属性和方法)
# 1.单继承
# 子类只继承一个父类
# 语法：class 子类名(父类名):
# 若在定义类时不指明该类的父类，默认继承object


class Animal:
    def __init__(self, sort):
        self.sort = sort

    def eat(self):
        print(f'{self.sort}会吃东西！')


class Dog(Animal):
    def __init__(self, sort, name, age):
        super().__init__(sort)  # 继承父类的构造方法
        self.name = name
        self.age = age

    def shout(self):
        print(f'{self.name}今年{self.age}岁了,汪汪叫')


d1 = Dog("狗", "大黄狗", 3)
d1.eat()  # 调用继承父类方法
d1.shout()


# 2.多继承
# 一个类可以继承多个类，即子类具有多个父类，也自动拥有父类的公有成员
# 语法：class 子类名(父类1,父类2...):
# 定义一个房子类
class House:
    position = "北京"

    def live(self):
        print(f'该房子的位置在:{self.position}')


# 定义一个车类
class Car:
    def __init__(self, band, color):
        self.band = band
        self.color = color

    def drive(self):
        print(f'该车品牌是:{self.band},颜色为:{self.color}')


# 定义一个人类继承房子类和车类
class Human(House, Car):
    def __init__(self, name, age, band, color):
        super().__init__(band, color)
        self.name = name
        self.age = age

    def property(self):
        print(f"{self.name}今年{self.age}岁有车有房")
        self.drive()
        self.live()


h1 = Human("小王", 18, "奔驰", "黑色")
h1.property()


# 重写
# 子类重写父类的方法，只需在子类中定义与父类同名的方法重新编写代码即可
# 子类重写父类方法后，子类对象默认调用的是子类重写后的方法
# 但可以通过super()函数间接调用父类重写前的方法
class Person:
    def hi(self):
        print("hello")


class Chinese(Person):
    def hi(self):
        print("中国人人见面打招呼")
        print("你好")
        print("外国人见面打招呼")
        super().hi()


chinese = Chinese()
chinese.hi()
